#include "normal.h"
#include "vector.h"

using namespace vivid;

Vector::Vector(Normal const & aNorm)
    : _x(aNorm._x), _y(aNorm._y), _z(aNorm._z)
{
}


VFloat Vector::Dot(Vector const & aVec) const
{
	return _x * aVec._x + _y * aVec._y + _z * aVec._z;
}


Vector Vector::Cross(Vector const & aVec) const
{
	return Vector(
		_y * aVec._z - _z * aVec._y,
		_x * aVec._z - _z * aVec._x,
		_x * aVec._y - _y * aVec._x);
}


VFloat Vector::Mag() const
{
	return sqrt(_x * _x + _y * _y + _z * _z);
}


VFloat Vector::MagSq() const
{
	return _x * _x + _y * _y + _z * _z;
}


Vector Vector::Normalize() const
{
	VFloat len = Mag();

	return Vector(_x / len, _y / len, _z / len);
}


Vector Vector::operator +(Vector const & aVec2)
{
	return Vector(_x + aVec2._x, _y + aVec2._y, _z + aVec2._z);
}


Vector Vector::operator -(Vector const & aVec2)
{
	return Vector(_x - aVec2._x, _y - aVec2._y, _z - aVec2._z);
}


Vector Vector::operator * (VFloat aNum)
{
	return Vector(_x * aNum, _y * aNum, _z * aNum);
}


Vector Vector::operator / (VFloat aNum)
{
	VFloat n = 1.0 / aNum;

	return Vector(_x * n, _y * n, _z * n);
}


Vector & Vector::operator = (Vector const &aV)
{
	_x = aV._x;
	_y = aV._y;
	_z = aV._z;

	return *this;
}

